package pl.edu.pk.psb.bc.dao;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import pl.edu.pk.psb.bc.ds.AdresDs;
import pl.edu.pk.psb.bc.ds.KategoriaDs;
import pl.edu.pk.psb.bc.ds.WydarzenieDs;
import pl.edu.pk.psb.bc.util.ParametryWyszukiwaniaWydarzen;

@Repository
public class WydarzenieDaoImpl extends GenericDaoImpl<WydarzenieDs> implements WydarzenieDao {

	public WydarzenieDaoImpl() {
		super(WydarzenieDs.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<WydarzenieDs> wyszukajWydarzenia(ParametryWyszukiwaniaWydarzen parametry) {
		Criteria kryteria = sessionFactory.getCurrentSession().createCriteria(WydarzenieDs.class);
		if (StringUtils.isNotBlank(parametry.getNazwaOpis())) {
			kryteria.add(Restrictions.like(WydarzenieDs.NAZWA_FIELD, "%" + parametry.getNazwaOpis() + "%"));
		}
		if (parametry.getDataOd() != null || parametry.getDataDo() != null) {
			// ktoras z dat jest uzupelniona
			if (parametry.getDataOd() != null && parametry.getDataDo() == null) {
				// data od jest uzupelniona
				kryteria.add(Restrictions.ge(WydarzenieDs.DATA_FIELD, parametry.getDataOd()));
			}
			if (parametry.getDataOd() == null && parametry.getDataDo() != null) {
				// data do jest uzupelniona
				kryteria.add(Restrictions.le(WydarzenieDs.DATA_FIELD, parametry.getDataDo()));
			}
			if (parametry.getDataOd() != null && parametry.getDataDo() != null) {
				// obie daty sa uzupelnione
				kryteria.add(Restrictions.between(WydarzenieDs.DATA_FIELD, parametry.getDataOd(), parametry.getDataDo()));
			}
		}
		if (parametry.getKategoria() != null) {
			Criteria kryteriaKategorii = kryteria.createCriteria(WydarzenieDs.KATEGORIA_FIELD);
			kryteriaKategorii.add(Restrictions.eq(KategoriaDs.POLE_ID, parametry.getKategoria()));
		}
		if (StringUtils.isNotBlank(parametry.getMiasto())) {
			Criteria kryteriaAdresu = kryteria.createCriteria(WydarzenieDs.ADRES_FIELD);
			kryteriaAdresu.add(Restrictions.like(AdresDs.MIASTO_FIELD, "%" + parametry.getMiasto() + "%"));
		}
		if (parametry.getCenaNormalnaOd() != null || parametry.getCenaNormalnaDo() != null) {
			// ktoras z cen normalnych jest uzupelniona
			if (parametry.getCenaNormalnaOd() != null && parametry.getCenaNormalnaDo() == null) {
				// cena od jest uzupelniona
				kryteria.add(Restrictions.ge(WydarzenieDs.CENA_NORMALNA_FIELD, parametry.getCenaNormalnaOd()));
			}
			if (parametry.getCenaNormalnaOd() == null && parametry.getCenaNormalnaDo() != null) {
				// cena do jest uzupelniona
				kryteria.add(Restrictions.le(WydarzenieDs.CENA_NORMALNA_FIELD, parametry.getCenaNormalnaDo()));
			}
			if (parametry.getCenaNormalnaOd() != null && parametry.getCenaNormalnaDo() != null) {
				// obie ceny sa uzupelnione
				kryteria.add(Restrictions.between(WydarzenieDs.CENA_NORMALNA_FIELD, parametry.getCenaNormalnaOd(), parametry.getCenaNormalnaDo()));
			}
		}
		if (parametry.getCenaUlgowaOd() != null || parametry.getCenaUlgowaDo() != null) {
			// ktoras z cen ulgowych jest uzupelniona
			if (parametry.getCenaUlgowaOd() != null && parametry.getCenaUlgowaDo() == null) {
				// cena od jest uzupelniona
				kryteria.add(Restrictions.ge(WydarzenieDs.CENA_ULGOWA_FIELD, parametry.getCenaUlgowaOd()));
			}
			if (parametry.getCenaUlgowaOd() == null && parametry.getCenaUlgowaDo() != null) {
				// cena do jest uzupelniona
				kryteria.add(Restrictions.le(WydarzenieDs.CENA_ULGOWA_FIELD, parametry.getCenaUlgowaDo()));
			}
			if (parametry.getCenaUlgowaOd() != null && parametry.getCenaUlgowaDo() != null) {
				// obie ceny sa uzupelnione
				kryteria.add(Restrictions.between(WydarzenieDs.CENA_ULGOWA_FIELD, parametry.getCenaUlgowaOd(), parametry.getCenaUlgowaDo()));
			}
		}

		return kryteria.list();
	}

	@Override
	public WydarzenieDs pobierzWydarzenieZMiejsca(Integer id) {
		Integer idWydarzenia = (Integer) sessionFactory.getCurrentSession().createSQLQuery("SELECT id_wydarzenia from miejsce_w_wydarzeniu where id_miejsca="+id).uniqueResult();
		return pobierz(idWydarzenia);
	}
}
